'##############
'Heizungs-Script
'##############

'Simuliert Wagenheizung, Zusatzheizung (evtl. auch gleich den Kühlkreislauf mit...)

'(c) 20.02.2009 Rüdiger Hülsmann

'Script Version: 1.1
'Omsi release: 1.0

'Needs:
'cockpit (für Taster und Regler)
'engine (for cooling circuit)
'door (for door opening status)

'Revision History:
'- Rüdiger Hülsmann	17.02.2009	File created
'- Rüdiger Hülsmann	20.02.2009	Batterietrennschalter eingefügt (v1.1)
'- Marcel Kuhnt		10.08.2009	Added Revision History
'- Marcel & Rüdiger	23.09.2010	Parking Heater, room temperature
'- RÜdiger Hülsmann	16.11.2010	Front heater
'- Rüdiger Hülsmann	18.11.2010	Improved front heater
'- Rüdiger Hülsmann	20.11.2010	Cabin heater, values adjusted
'- Rüdiger Hülsmann	22.11.2010	Auxheat Schmitt-triggered, engine coolable by fan heaters
'- bocskor3	                  	6.11.2013	Webasto Parking Heater
'- bocskor3	                  	9.11.2013	Thermoking Automatic Air Conditioner

'------------------------------------------------------------------------------------------

'----------------------
'	Init
'----------------------
{macro:heizung_init}
	(L.S.Weather_Temperature) (S.L.Cabinair_Temp) (S.L.tank_percent)
	(L.S.Weather_AbsHum) (S.L.Cabinair_absHum)
	1 (S.L.futesventillator_0)
{end}

{macro:heizung_frame}

	(M.L.umwaelz_frame)
	(M.L.standheizung_frame)	
	(M.L.cabinair_frame)
	(M.L.legkondi_frame)
	
{end}

{macro:legkondi_frame}

'	Amikor a belsõ hõmérséklet kisebb, mint a beállított, akkor a fûtés parancs lép érvénybe:

	(L.L.Cabinair_Temp) 0.3 + (L.L.cockpit_heizregler_temp) <
	(L.L.cp_thermoking_sw) && (L.L.elec_busbar_main)  > && (L.L.engine_on) &&
	{if}
	1 (S.L.thermoking_futes)
	{else}
	0 (S.L.thermoking_futes)
	{endif}

'	Az elõzõ ellentéte:

	(L.L.Cabinair_Temp) 0.2 + (L.L.cockpit_heizregler_temp) >
	(L.L.cp_thermoking_sw) && (L.L.elec_busbar_main)  > && (L.L.engine_on) &&
	{if}
	1 (S.L.thermoking_hutes)
	{else}
	0 (S.L.thermoking_hutes)
	{endif}

'	Fûtés:
	(L.L.thermoking_futes)
	{if}
	(C.L.heizung_Qrate_thermoking) (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_thermoking) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}

'	Hûtés:
	(L.L.thermoking_hutes)
	{if}
	(C.L.heizung_Qrate_thermoking) (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_thermokinghut) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}

'	Hang+Visszajelzõlámpa
	(L.L.thermoking_futes) ||
	(L.L.thermoking_hutes) ||
	(L.L.elec_busbar_main) &&
	(S.L.thermoking_on)

	(L.L.cp_thermoking_sw)
	(L.L.elec_busbar_main) && 
	(S.L.cockpit_light_thermoking)

{end}

{macro:cabinair_frame}

'	Berechnung der Raten:
	(L.L.Cabinair_Temp) (L.S.Weather_Temperature) - (C.L.cabinair_Qrate_envir_factor) * (S.L.cabinair_Qrate_envir)

'	Direkte Ableitung der Motorwärme in den Fahrgastraum
	(L.L.engine_temperature) (L.L.Cabinair_Temp) - (C.L.cabinair_Qrate_engine_factor) * (S.L.cabinair_Qrate_engine)

'	Âåíòèëÿòîðû îòîïèòåëåé
	(L.L.thermoking_on)
	{if}
		(L.L.vent1_time) 5 <
		{if}
			(L.L.vent1_time) (L.S.Timegap) + (S.L.vent1_time)
		{endif}
		(L.L.vent1_time) (F.L.vent_speed_on) (S.L.vent1_speed)
		1 (S.L.salon_otopitel_1)
	{else}
		(L.L.vent1_time) 0 >
		{if}
			(L.L.vent1_time) (L.S.Timegap) - (S.L.vent1_time)
		{endif}
		(L.L.vent1_time) (F.L.vent_speed_off) (S.L.vent1_speed)
		0 (S.L.salon_otopitel_1)
	{endif}
	
	(L.L.otopitel_vent_1) (L.S.Timegap) (L.L.vent1_speed) * + (S.L.otopitel_vent_1)	
	

'Berechnung der effektiven Gesamt-Luftaustauschfläche:
	(L.L.door_0) (L.L.door_1) (L.L.door_2) (L.L.door_3) + + + (C.L.cabinair_A_perdoor) *

	(L.L.cp_klappfenster_OR1) (L.L.cp_klappfenster_OR2) (L.L.cp_klappfenster_OR3) (L.L.cp_klappfenster_OR4) + + +
	(L.L.cp_klappfenster_OL1) (L.L.cp_klappfenster_OL2) (L.L.cp_klappfenster_OL3) (L.L.cp_klappfenster_OL4) + + + +
	(L.L.cp_klappfenster_UR1) (L.L.cp_klappfenster_UR2) (L.L.cp_klappfenster_UR3) (L.L.cp_klappfenster_UR4) + + + +
	(L.L.cp_klappfenster_UL1) (L.L.cp_klappfenster_UL2) (L.L.cp_fahrerfenster_pos) + + +
	(C.L.cabinair_A_perwindow) * + 

'Berechnung des Gesamtvolumenstroms in die Außenwelt und umgekehrt (V zählt je Richtung, d.h. insgesamt wird 2*V bewegt)
	(L.L.velocity) 20 / abs (C.L.cabinair_windowdoor_minkmh) + (C.L.cabinair_windowdoor_effectivity) * 3.6 / * (S.L.cabinair_Vrate_doorwindow)

'Berechnung des Volumenstroms durch die Raumheizgeräte
'MC 2011 0619: Es hängt natürlich von der tatsächlichen Drehzahl der "cabinheater" ab! Nicht von der Schalterstellung! ;-)
	(C.L.cabinair_A_cabinheater) (L.L.cp_cabinheater_RPM) 100 / * (S.L.cabinair_Vrate_cabinheater)

'Berechnung der Temperaturrate durch Motor und Abstrahlung an die Umwelt...
	(L.L.cabinair_Qrate_engine) (L.L.cabinair_Qrate_envir) - (C.L.cabinair_cvm) /
'...und Temperaturrate durch Passagiere...
	(C.L.cabinair_T_passenger) (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (C.L.cabinair_Vrate_passenger) * (L.L.humans_count) * +
'...und dieser durch die Volumenströme durch Fenster und Türen:
	(L.S.Weather_Temperature) (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_doorwindow) * +
'...und des Frontheizgerätes...
	(L.L.fanheater_t_target) (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_fanheater) * +
'...und der Raumheizgeräte...
	(L.L.engine_temperature) (C.L.heat_exchanger_effectivity) * (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_cabinheater) * +
'...aufintegrieren:
	(L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)

'Berechnung der Motorkühlrate durch die Wärmetauscher in den Heizgeräten:

	(L.L.fanheater_t_target) (L.L.Cabinair_Temp) - 0 max (C.L.cabinair_V) / (L.L.cabinair_Vrate_fanheater) * 
	(L.L.engine_temperature) (C.L.heat_exchanger_effectivity) * (L.L.Cabinair_Temp) max (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_cabinheater) * +
	(C.L.cabinair_cvm) * 8 * (S.L.cabinair_Qrate_engine_fanheatcooling)



'Berechnung der Feuchtigkeitsrate durch Volströme mit den Passagieren:
	(C.L.cabinair_absHum_passenger) (L.L.Cabinair_absHum) - (C.L.cabinair_V) / (C.L.cabinair_Vrate_passenger) * (L.L.humans_count) *
'Berechnung der Feuchtigkeitsrate durch Volumenströme mit der Außenwelt:
	(L.S.Weather_AbsHum) (L.L.Cabinair_absHum) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_doorwindow) * +
'Berechnung der Feuchtigkeitsrate durch Frontheizgerät
	(L.S.Weather_AbsHum) (L.L.Cabinair_absHum) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_fanheater) * (L.L.cockpit_heizregler_ventilation_mode) 1 >= * + (S.L.cabinair_test)
'... aufintegrieren:
	(L.S.Timegap) * (L.L.Cabinair_absHum) + (S.L.Cabinair_absHum)



{end}

{macro:umwaelz_frame}
'Wenn Strom da ist und der Heizungsregler geöffnet wird, dann geht die Umwälzpumpe an:

	(L.L.cp_szivattyu_sw) (L.L.Cabinair_Temp) 27 < &&
	{if}
		1 (S.L.heizung_umwaelzpumpe)
	{else}
		0 (S.L.heizung_umwaelzpumpe)
	{endif}

{end}


{macro:standheizung_frame}


'	Amikor megy a kályha meg megy a szivattyú is, akkor fûti az utasteret


             (L.L.cp_kalyha_sw) (L.L.heizung_umwaelzpumpe) &&
             {if}
                  1 (S.L.standheizung_target)
             {else}
                  0 (S.L.standheizung_target)
             {endif}

'            Jöjj rá magadtól, és is szoptam vele

             (L.L.heizung_umwaelzpumpe)
             {if}
                  0 (S.L.standheizung_pumpaki)
             {else}
                  1 (S.L.standheizung_pumpaki)
             {endif}

'            Amíg a motor el nem ér egy hõmérsékletet, addig fhût

            (L.L.engine_temperature) 65 <  (L.L.Cabinair_Temp) 27 < &&
            {if}
            1 (S.L.standheizung_motorhideg)
            {else}
            0 (S.L.standheizung_motorhideg)
            {endif}

            (L.L.engine_temperature) 64 > (L.L.Cabinair_Temp) 27 < &&
            {if}
            1 (S.L.standheizung_motormeleg)
            {else}
            0 (S.L.standheizung_motormeleg)
            {endif}

            (L.L.standheizung_target) (L.L.standheizung_motorhideg) &&
            {if}
            (C.L.heizung_Qrate_standheizung) (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_olajkalyha) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
            {endif}

            (L.L.cp_kalyha_sw) (L.L.standheizung_pumpaki) && (L.L.standheizung_motorhideg) &&
            {if}
            (C.L.heizung_Qrate_standheizung) (L.L.cabinair_Qrate_envir) - / (L.S.Timegap) * (L.L.engine_temperature) + (S.L.engine_temperature)
            {endif} 

            (L.L.heizung_umwaelzpumpe) (L.L.standheizung_motormeleg) &&
            {if}
            (C.L.heizung_Qrate_standheizung) (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_olajkalyha) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
            {endif}

{end}